package com.bst.bsj.portal.util;

import java.io.File;
import java.security.Security;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;

import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.mail.internet.MimeUtility;

public class MailUtils {

	String to = ""; // 收件人
	String from = ""; // 发件人
	String host = ""; // smtp主机
	String username = "";
	String password = "";
	String filename = ""; // 附件文件名
	String subject = ""; // 邮件主题
	String content = ""; // 邮件正文
	String port = ""; // smtp端口
	Vector file = new Vector(); // 附件文件集合
	Map<String, String> imagesMap = new HashMap<String, String>();

	/**
	 * <br>
	 * 方法说明：默认构造器 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public MailUtils() {
	}

	/**
	 * <br>
	 * 方法说明：构造器，提供直接的参数传入 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public MailUtils(String to, String from, String smtpServer,
			String username, String password, String subject, String content) {
		this.to = to;
		this.from = from;
		this.host = smtpServer;
		this.username = username;
		this.password = password;
		this.subject = subject;
		this.content = content;
	}

	/**
	 * <br>
	 * 方法说明：设置邮件服务器地址 <br>
	 * 输入参数：String host 邮件服务器地址名称 <br>
	 * 返回类型：
	 */
	public void setHost(String host) {
		this.host = host;
	}

	/**
	 * <br>
	 * 方法说明：设置登录服务器校验密码 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public void setPassWord(String pwd) {
		this.password = pwd;
	}

	/**
	 * <br>
	 * 方法说明：设置登录服务器校验用户 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public void setUserName(String usn) {
		this.username = usn;
	}

	/**
	 * <br>
	 * 方法说明：设置邮件发送目的邮箱 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public void setTo(String to) {
		this.to = to;
	}

	/**
	 * <br>
	 * 方法说明：设置邮件发送源邮箱 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public void setFrom(String from) {
		this.from = from;
	}

	/**
	 * <br>
	 * 方法说明：设置邮件主题 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public void setSubject(String subject) {
		this.subject = subject;
	}

	/**
	 * <br>
	 * 方法说明：设置邮件内容 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public void setContent(String content) {
		this.content = content;
	}

	public void setPort(String port) {
		this.port = port;
	}

	public String getPort() {
		return port;
	}

	/**
	 * <br>
	 * 方法说明：把主题转换为中文 <br>
	 * 输入参数：String strText <br>
	 * 返回类型：
	 */
	public String transferChinese(String strText) {
		try {
			strText = MimeUtility.encodeText(strText, "GB2312", "B");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strText;
	}

	/**
	 * <br>
	 * 方法说明：往附件组合中添加附件 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public void attachfile(String fname) {
		file.addElement(fname);
	}

	/**
	 * 设置图片
	 * 
	 * @param key
	 * @param value
	 */
	public void putImage(String key, String value) {
		imagesMap.put(key, value);
	}

	/**
	 * <br>
	 * 方法说明：发送邮件 <br>
	 * 输入参数： <br>
	 * 返回类型：boolean 成功为true，反之为false
	 */
	public boolean sendMail(boolean isSsl) {

		// 构造mail session
		Properties props = new Properties();
		props.setProperty("mail.transport.protocol", "smtp");
		props.put("mail.smtp.host", host);
		props.put("mail.smtp.auth", "true");
		if (isSsl) {
			Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
			props.setProperty("mail.smtp.socketFactory.class",
					"javax.net.ssl.SSLSocketFactory");
			props.setProperty("mail.smtp.socketFactory.fallback", "false");
		} else {
			props.setProperty("mail.smtp.starttls.enable", "true");
			props.setProperty("mail.smtp.socketFactory.fallback", "true");
		}
		props.setProperty("mail.smtp.port", port);
		props.setProperty("mail.smtp.socketFactory.port", port);
		Session session = Session.getDefaultInstance(props,
				new Authenticator() {
					public PasswordAuthentication getPasswordAuthentication() {
						return new PasswordAuthentication(username, password);
					}
				});
		// session.setDebug(true);
		// Session session = Session.getDefaultInstance(props);
		// Session session = Session.getDefaultInstance(props, null);

		try {
			// 构造MimeMessage 并设定基本的值
			MimeMessage msg = createMessage(session);
			// new MimeMessage(session);
			// // MimeMessage msg = new MimeMessage();
			// msg.setFrom(new InternetAddress(from));
			//
			// // msg.addRecipients(Message.RecipientType.TO, address);
			// //这个只能是给一个人发送email
			// msg.addRecipients(Message.RecipientType.TO,
			// InternetAddress.parse(to));
			// //msg.setRecipients(Message.RecipientType.BCC,
			// InternetAddress.parse(to));
			// subject = transferChinese(subject);
			// msg.setSubject(subject);
			//
			// //msg.setHeader("Content-Type", "text/html;charset=gb2312");
			// //msg.setHeader("Content-Transfer-Encoding", "7bit");
			// //SimpleDateFormat format = new
			// SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss Z");
			// // msg.setHeader("Date", format.format(new Date()));
			//
			// // 构造Multipart
			// Multipart mp = new MimeMultipart();
			//
			// // 向Multipart添加正文
			// MimeBodyPart mbpContent = new MimeBodyPart();
			// mbpContent.setContent(content, "text/html;charset=gb2312");
			//
			// // 向MimeMessage添加（Multipart代表正文）
			// mp.addBodyPart(mbpContent);
			//
			// // 向Multipart添加附件
			// Enumeration efile = file.elements();
			// while (efile.hasMoreElements()) {
			//
			// MimeBodyPart mbpFile = new MimeBodyPart();
			// filename = efile.nextElement().toString();
			// FileDataSource fds = new FileDataSource(filename);
			// mbpFile.setDataHandler(new DataHandler(fds));
			// // 这个方法可以解决附件乱码问题
			// String filename = new String(fds.getName().getBytes(),
			// "ISO-8859-1");
			//
			// mbpFile.setFileName(filename);
			// // 向MimeMessage添加（Multipart代表附件）
			// mp.addBodyPart(mbpFile);
			//
			// }
			//
			// file.removeAllElements();
			// // 向Multipart添加MimeMessage
			// msg.setContent(mp);
			// msg.setSentDate(new Date());
			// msg.saveChanges();
			// 发送邮件
			Transport transport = session.getTransport("smtp");
			transport.connect(host, username, password);
			transport.sendMessage(msg, msg.getAllRecipients());

			// Transport transport=session.getTransport();
			// transport.connect();
			// transport.sendMessage(msg,
			// msg.getRecipients(Message.RecipientType.TO));

			transport.close();
		} catch (Exception mex) {
			mex.printStackTrace();
			// Exception ex = null;
			// if ((ex = mex.getNextException()) != null) {
			// ex.printStackTrace();
			// }
			return false;
		}
		return true;
	}

	public MimeMessage createMessage(Session session) throws Exception {

		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(this.from));
		message.setRecipients(Message.RecipientType.TO,
				InternetAddress.parse(to));
		message.setSubject(this.subject);

		MimeMultipart allMultipart = new MimeMultipart();

		// 创建代表邮件正文和附件的各个MimeBodyPart对象
		MimeBodyPart contentpart = createContent(content);
		allMultipart.addBodyPart(contentpart);

		Enumeration efile = file.elements();
		while (efile.hasMoreElements()) {
			MimeBodyPart mbpFile = new MimeBodyPart();
			filename = efile.nextElement().toString();
			FileDataSource fds = new FileDataSource(filename);
			mbpFile.setDataHandler(new DataHandler(fds));
			// 这个方法可以解决附件乱码问题
			String filename = new String(fds.getName().getBytes(), "ISO-8859-1");

			mbpFile.setFileName(filename);
			// 向MimeMessage添加（Multipart代表附件）
			allMultipart.addBodyPart(mbpFile);

		}

		file.removeAllElements();
		// 设置整个邮件内容为最终组合出的MimeMultipart对象
		message.setContent(allMultipart);
		message.saveChanges();
		return message;
	}

	@SuppressWarnings({ "rawtypes", "unchecked" })
	public MimeBodyPart createContent(String body) throws Exception {
		// 创建代表组合Mime消息的MimeMultipart对象，将该MimeMultipart对象保存到MimeBodyPart对象
		MimeBodyPart contentPart = new MimeBodyPart();
		MimeMultipart contentMultipart = new MimeMultipart("related");

		// 创建用于保存HTML正文的MimeBodyPart对象，并将它保存到MimeMultipart中
		MimeBodyPart htmlbodypart = new MimeBodyPart();
		htmlbodypart.setContent(body, "text/html;charset=UTF-8");
		contentMultipart.addBodyPart(htmlbodypart);

		if (imagesMap != null && imagesMap.size() > 0) {
			Set<Entry<String, String>> set = imagesMap.entrySet();
			for (Iterator iterator = set.iterator(); iterator.hasNext();) {
				Entry<String, String> entry = (Entry<String, String>) iterator
						.next();
				// 创建用于保存图片的MimeBodyPart对象，并将它保存到MimeMultipart中
				MimeBodyPart gifBodyPart = new MimeBodyPart();
				FileDataSource fds = new FileDataSource(entry.getValue());// 图片所在的目录的绝对路径
				gifBodyPart.setDataHandler(new DataHandler(fds));
				gifBodyPart.setContentID(entry.getKey()); // cid的值
				contentMultipart.addBodyPart(gifBodyPart);
			}
		}

		// 将MimeMultipart对象保存到MimeBodyPart对象
		contentPart.setContent(contentMultipart);
		return contentPart;
	}

	public MimeBodyPart createAttachment(String filename) throws Exception {
		// 创建保存附件的MimeBodyPart对象，并加入附件内容和相应的信息
		MimeBodyPart attachPart = new MimeBodyPart();
		FileDataSource fsd = new FileDataSource(filename);
		attachPart.setDataHandler(new DataHandler(fsd));
		attachPart.setFileName(fsd.getName());
		return attachPart;
	}
	public MimeBodyPart createAttachment(File file) throws Exception {
        // 创建保存附件的MimeBodyPart对象，并加入附件内容和相应的信息
        MimeBodyPart attachPart = new MimeBodyPart();
        FileDataSource fsd = new FileDataSource(file);
        attachPart.setDataHandler(new DataHandler(fsd));
        attachPart.setFileName(fsd.getName());
        return attachPart;
    }
	/**
	 * <br>
	 * 方法说明：主方法，用于测试 <br>
	 * 输入参数： <br>
	 * 返回类型：
	 */
	public static void main(String[] args) {
//		MailUtils sendmail = new MailUtils();
//		sendmail.setHost("smtp.exmail.qq.com");
//		sendmail.setPort("25");
//		sendmail.setUserName("info@moree.cn");
//		sendmail.setPassWord("Hello1234");
//		sendmail.setTo("729008666@qq.com");
//		sendmail.setFrom("info@moree.cn");
//		sendmail.setSubject("t305好友邀请");
//		sendmail.setContent("t305好友邀请链接");
//		sendmail.sendMail(false);
	}
}
